"""
在线词典客户端模型
"""
from socket import *
import sys
import re
import getpass

# 服务端地址
ADDR = ("127.0.0.1", 8888)


# 发起请求
class DictHandle:
    # 验证字符串格式 4-12为数字字母下划线汉字
    @staticmethod
    def check(info):
        if re.search(r"^\w{4,12}$", info):  # 利用正则检验输入的用户名是否可以被匹配出来
            return True

    def __init__(self):
        self.sock = self._connect()  # 创建套接字

    def _connect(self):
        sock = socket()
        sock.connect(ADDR)  # 绑定服务端地址
        return sock

    def do_exit(self):
        self.sock.send(b'E')  # 发送请求  关闭套接字  结束进程
        self.sock.close()
        sys.exit("谢谢使用")

    def do_register(self, name, passwd):
        # 发送请求
        if DictHandle.check(name) and DictHandle.check(passwd):  # 验证用户名和密码
            request = "R %s %s" % (name, passwd)  # 将请求头和名字、密码拼接在一起
            self.sock.send(request.encode())  # 将注册用户请求发送到客户端
            # 接收响应
            response = self.sock.recv(128)
            if response == b"T":  # 查看响应类型
                print("注册成功")
            else:
                print("注册失败")
        else:
            print("用户名或密码为4-12为数字字母下划线构成")

    def do_login(self, name, passwd):  # 用户名和密码传入到登录方法
        # 发送请求
        request = "L %s %s" % (name, passwd)  # 将登录请求头和用户名、密码拼接在一起
        self.sock.send(request.encode())  # 将登录请求发送到服务端
        # 接收响应
        response = self.sock.recv(128)
        if response == b"T":  # 验证结果是否可以进入
            print("登录成功")
            return True
        else:
            print("登录失败")

    # 查单词
    def do_query(self):
        # 进入查词状态
        while True:
            word = input("Word：")  # 输入单词
            if word == '##':
                break
            request = "Q " + word  # 发送查询单词请求
            self.sock.send(request.encode())
            response = self.sock.recv(1024).decode()  # 接收请求
            tmp = response.split(" ", 1)  # 解析查看请求结果
            if tmp[0] == "T":
                print("%s : %s\n" % (word, tmp[1]))
            else:
                print("%s : Not Found!\n" % word)

    # 历史记录 熟悉协议格式
    def do_history(self):
        self.sock.send(b"H")  # 发送请求
        response = self.sock.recv(1024 * 10).decode()  # 得到回复
        tmp = response.split(' ', 1)  # T data 解析请求
        if tmp[0] == 'T':
            for row in tmp[1].split(';'):
                print(row)
        else:
            print("您还没有查询记录")


class DictView:
    def __init__(self):
        self.handle = DictHandle()  # 跨类调用

    def child(self, name):
        while True:
            print("""
    ============== Query ==============
     1. 查单词   2. 历史记录   3. 注销
    ======================User:%s=====
            """ % name)
            cmd = input("请输入选项:")
            if cmd == "1":
                self.handle.do_query()  # 查单词
            elif cmd == "2":
                self.handle.do_history()  # 查看历史记录
            elif cmd == "3":
                break
            else:
                print("请输入正确选项！")

    def main(self):
        while True:
            print("""
    ========== Welcome =========
     1. 注册   2. 登录   3. 退出
    ============================
            """)
            cmd = input("请输入选项:")
            if cmd == "1":
                name = input("User:")
                passwd = getpass.getpass()  # 隐藏数据内容
                self.handle.do_register(name, passwd)  # 输入用户名密码传递给注册用户函数
            elif cmd == "2":
                name = input("User:")
                passwd = getpass.getpass()
                if self.handle.do_login(name, passwd):  # 输入用户名密码传递给登录函数
                    self.child(name)  # 二级界面
            elif cmd == "3":
                self.handle.do_exit()  # 退出
            else:
                print("请输入正确选项！")


if __name__ == '__main__':
    dict = DictView()
    dict.main()  # 启动界面
